﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;

namespace WBasicClassLib.IniByXml
{
    /// <summary>
    /// 对使用Xml文件作为存储载体的IniByXml文件进行写入操作
    /// IniByXml文件支持除根元素外的一维空间节点，对节点的描述使用属性来标明
    /// </summary>
    public class IniByXmlWriter
    {
        #region 属性及成员变量

        /// <summary>
        /// 绑定的文件名
        /// </summary>
        private string _BindingFile;
        public string BindingFile
        {
            get
            {
                return _BindingFile;
            }
        }

        /// <summary>
        /// Xml内存模型，最后用来储存到指定的路径中
        /// </summary>
        private XDocument XmlDoc;
        /// <summary>
        /// Xml内存模型，指向文档的根节点
        /// </summary>
        private XElement XmlWriter;

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="Filename">传入的Xml配置文件的路径</param>
        /// <param name="EncodingKind">Xml文档编码类型</param>
        public IniByXmlWriter(string Filename, Encoding EncodingKind )
        {
            _BindingFile = Filename;
            if (!File.Exists(_BindingFile))
            {
                XmlDoc = new XDocument
                                          (
                                                new XDeclaration("1.0", EncodingKind.EncodingName, "yes"),
                                                new XElement(Filename,
                                                    new XAttribute("Date", DateTime.Now.ToString())
                                                                      )
                                          );
            }
            else
            {
                XmlDoc = XDocument.Load(_BindingFile);
            }
            XmlWriter = XmlDoc.Element(Filename);
        }

        #endregion

        #region 方法

        /// <summary>
        /// 将Xml配置文件内容保存到指定的文件路径中
        /// </summary>
        /// <returns>保存是否成功</returns>      
        public bool Save()
        {
            try
            {
                XmlWriter.Save(_BindingFile);
            }
            catch        
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// 添加新元素（只能为二级元素，且允许重复）
        /// </summary>
        /// <param name="ParentName">要添加的新元素的父节点名称</param>
        /// <param name="AddinElem">要添加的新元素（只能为二级元素，允许重复）</param>
        public void AddElement(string ParentName, XElement AddinElem)
        {
            try
            {
                XmlWriter.Element(ParentName).Add(AddinElem);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 向配置文件中写入一个Xml元素节点以及对这个节点的描述，元素名不允许重复
        /// </summary>
        /// <param name="In">要输入的Xml元素节点</param>
        /// <param name="Description">对输入的Xml元素节点的描述，默认为空</param>
        /// <returns>写入是否成功</returns>
        public bool WriteInAElement(XElement In, string Description)
        {
            In.Value = Description;
            if (XmlWriter.Element(In.Name) == null)
            {
                XmlWriter.Add(In);
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 向配置文件中写入一个Xml元素节点以及对这个节点的描述，元素名不允许重复
        /// </summary>
        /// <param name="In">要输入的Xml元素节点</param>
        /// <returns>写入是否成功</returns>
        public bool WriteInAElement(XElement In)
        {
            if (XmlWriter.Element(In.Name) == null)
            {
                XmlWriter.Add(In);
                return true;
            }
            else
            {
                return false;
            }
        }

        #endregion
    }
}
